ac9fc60758e6709a0b791b554bcbde94c48424e3,trunk/JLanguageTool/src/java/de/danielnaber/languagetool/rules/patterns/PatternRule.java,PatternRule,match,#AnalyzedSentence#,296
Before Change
exceptionMatched = true;
prevMatched = true;
}
if (elem.isReferenceElement()
&& (firstMatchToken + elem.getMatch().getTokenRef() < tokens.length)) {
elem.compile(tokens[firstMatchToken
+ elem.getMatch().getTokenRef()], language.getSynthesizer());
}
if (elem.hasAndGroup()) {
for (final Element andElement : elem.getAndGroup()) {
if (andElement.isReferenceElement()
&& (firstMatchToken + andElement.getMatch().getTokenRef() < tokens.length)) {
andElement.compile(tokens[firstMatchToken
+ andElement.getMatch().getTokenRef()], language
.getSynthesizer());
}
}
After Change
public final RuleMatch[] match(final AnalyzedSentence text)
throws IOException {
final List<RuleMatch> ruleMatches = new ArrayList<RuleMatch>();
final AnalyzedTokenReadings[] tokens = text.getTokensWithoutWhitespace();
final int[] tokenPositions = new int[tokens.length + 1];
int tokenPos = 0;
int prevSkipNext = 0;
int skipNext = 0;
int matchPos = 0;
int skipShift = 0;
// this variable keeps the total number
// of tokens skipped - used to avoid
// that nextPos gets back to unmatched tokens...
int skipShiftTotal = 0;
int firstMatchToken = -1;
int lastMatchToken = -1;
final int patternSize = patternElements.size();
Element elem = null, prevElement = null;
final boolean sentStart = patternElements.get(0).isSentStart();
language.getUnifier().reset();
boolean inUnification = false;
boolean uniMatched = false;
for (int i = 0; i < tokens.length; i++) {
boolean allElementsMatch = true;
// stop processing if rule is longer than the sentence
// or stop looking for sent_start - it will never match any token except
// the first
if (patternSize + i > tokens.length || sentStart && i > 0) {
allElementsMatch = false;
break;
}
int matchingTokens = 0;
for (int k = 0; (k < patternSize); k++) {
if (elem != null) {
prevElement = elem;
}
elem = patternElements.get(k);
skipNext = translateElementNo(elem.getSkipNext());
final int nextPos = tokenPos + k + skipShiftTotal;
if (nextPos >= tokens.length) {
allElementsMatch = false;
break;
}
boolean skipMatch = false, thisMatched = false, prevMatched = false;
boolean exceptionMatched = false;
if (prevSkipNext + nextPos >= tokens.length || prevSkipNext < 0) { // SENT_END?
prevSkipNext = tokens.length - (nextPos + 1);
}
for (int m = nextPos; m <= nextPos + prevSkipNext; m++) {
boolean matched = false;
final int numberOfReadings = tokens[m].getReadingsLength();
for (int l = 0; l < numberOfReadings; l++) {
final boolean lastReading = l + 1 == numberOfReadings;
final AnalyzedToken matchToken = tokens[m].getAnalyzedToken(l);
if (prevSkipNext > 0 && prevElement != null
&& prevElement.isMatchedByScopeNextException(matchToken)) {
exceptionMatched = true;
prevMatched = true;
}
if (elem.isReferenceElement()) {
setupRef(firstMatchToken, elem, tokens);
}
if (elem.hasAndGroup()) {
for (final Element andElement : elem.getAndGroup()) {